const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const syno = require('./synology_api');
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
const mongoose = require('mongoose');
// 修复 MongoDB 连接警告
mongoose.connect('mongodb://localhost:27017/nas_share');
const { v4: uuidv4 } = require('uuid');
const Share = require('./models/Share');

const app = express();
const port = 3000;

app.use(cors());
app.use(bodyParser.json());

// 登录接口
app.post('/api/login', async (req, res) => {
  const { account, passwd } = req.body;
  try {
    const sid = await syno.login(account, passwd);
    res.json({ sid });
  } catch (err) {
    res.status(401).json({ error: err.message });
  }
});

// 获取共享文件夹列表
app.get('/api/shares', async (req, res) => {
  const { sid } = req.query;
  try {
    const data = await syno.listShare(sid);
    res.json(data);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 获取文件夹下文件列表
app.get('/api/files', async (req, res) => {
  const { sid, path } = req.query;
  try {
    const data = await syno.listFiles(sid, path);
    res.json(data);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 上传文件接口
app.post('/api/upload', upload.single('file'), async (req, res) => {
  const { sid, path } = req.body;
  const file = req.file;
  if (!sid || !path || !file) {
    return res.status(400).json({ error: '缺少参数 sid、path 或 file' });
  }
  try {
    const data = await syno.uploadFile(sid, path, file);
    res.json(data);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 复制文件或文件夹接口
app.post('/api/copy', async (req, res) => {
  const { sid, src, dest } = req.body;
  if (!sid || !src || !dest) {
    return res.status(400).json({ error: '缺少参数 sid、src 或 dest' });
  }
  try {
    const data = await syno.copyFile(sid, src, dest);
    res.json(data);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 删除文件或文件夹接口
app.post('/api/delete', async (req, res) => {
  const { sid, path } = req.body;
  if (!sid || !path) {
    return res.status(400).json({ error: '缺少参数 sid 或 path' });
  }
  try {
    const data = await syno.deleteFile(sid, path);
    res.json(data);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 移动文件或文件夹接口
app.post('/api/move', async (req, res) => {
  const { sid, src, dest } = req.body;
  console.log('move req.body:', req.body); // 新增日志
  if (!sid || !src || !dest) {
    return res.status(400).json({ error: '缺少参数 sid、src 或 dest' });
  }
  try {
    const data = await syno.moveFile(sid, src, dest);
    if (data.success === false) return res.json(data);

    // 如果是异步任务，轮询直到 finished
    if (data.data && data.data.taskid) {
      const taskid = data.data.taskid;
      let finished = false, status;
      for (let i = 0; i < 60; i++) { // 最多等60秒
        await new Promise(r => setTimeout(r, 1000));
        status = await syno.deleteStatus(sid, taskid); // 用 deleteStatus 轮询 CopyMove 任务
        if (status.data && status.data.finished) {
          finished = true;
          break;
        }
      }
      if (!finished) return res.status(500).json({ error: '移动超时' });
    }

    // 现在可以安全更新 path
    if (Array.isArray(src)) {
      for (const s of src) {
        const oldPath = s;
        const newPath = dest + '/' + (s.split('/').pop());
        await updateSharePath(oldPath, newPath);
      }
    } else {
      const oldPath = src;
      const newPath = dest + '/' + (src.split('/').pop());
      await updateSharePath(oldPath, newPath);
    }
    res.json(data);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 文件下载接口
app.get('/api/download', async (req, res) => {
  const { sid, path } = req.query;
  if (!sid || !path) {
    return res.status(400).json({ error: '缺少参数 sid 或 path' });
  }
  try {
    await syno.downloadFile(sid, path, res);
    // 响应已由 downloadFile 处理
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 新建文件夹接口
app.post('/api/create-folder', async (req, res) => {
  const { sid, parent, name } = req.body;
  if (!sid || !parent || !name) {
    return res.status(400).json({ error: '缺少参数 sid、parent 或 name' });
  }
  try {
    const data = await syno.createFolder(sid, parent, name);
    res.json(data);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 查询删除进度
app.get('/api/delete-status', async (req, res) => {
  const { sid, taskid } = req.query;
  if (!sid || !taskid) {
    return res.status(400).json({ error: '缺少参数 sid 或 taskid' });
  }
  try {
    const data = await syno.deleteStatus(sid, taskid);
    res.json(data);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// 生成分享链接
app.post('/api/share', async (req, res) => {
  const { sid, path, filename, owner, expiresAt } = req.body;
  if (!sid || !path) return res.status(400).json({ error: '缺少参数 sid 或 path' });
  const shareId = uuidv4();
  await Share.create({ shareId, path, filename, owner, expiresAt });
  res.json({ url: `http://localhost:3000/share/${shareId}` });
});
// 访问分享链接
app.get('/api/share/:id', async (req, res) => {
  const share = await Share.findOne({ shareId: req.params.id });
  if (!share) return res.status(404).send('分享不存在');
  // 优先用前端传递的 sid
  const sid = req.query.sid;
  if (!sid) return res.status(401).send('请先登录');
  try {
    const syno = require('./synology_api');
    const resp = await syno.createSharing(sid, share.path);
    if (resp.success && resp.data && resp.data.links && resp.data.links[0]) {
      const url = resp.data.links[0].url;
      return res.redirect(url);
    } else {
      return res.status(500).send('生成群晖分享链接失败');
    }
  } catch (e) {
    return res.status(500).send('内部错误: ' + e.message);
  }
});
// 兼容旧分享链接，自动跳转到新接口
app.get('/share/:id', (req, res) => {
  const query = req.url.includes('?') ? req.url.slice(req.url.indexOf('?')) : '';
  res.redirect(`/api/share/${req.params.id}${query}`);
});
// 文件移动时同步更新分享路径
async function updateSharePath(oldPath, newPath) {
  // 递归更新所有以 oldPath 开头的 path，使用 $substrCP 支持中文
  await Share.updateMany(
    { path: { $regex: `^${oldPath.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')}` } },
    [
      {
        $set: {
          path: {
            $concat: [
              newPath,
              { $substrCP: ["$path", oldPath.length, { $strLenCP: "$path" }] }
            ]
          }
        }
      }
    ]
  );
}

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}`);
}); 